import Cookies from 'js-cookie';
import { generateUUID } from "./tool";
const DEFAULT_CACHE_TIME = 60 * 60 * 24;

/**
 * window.localStorage 浏览器永久缓存
 * @method set 设置永久缓存
 * @method get 获取永久缓存
 * @method remove 移除永久缓存
 * @method clear 移除全部永久缓存
 */
export const Local = {
	/**
	 * 生成带前缀的键名，以便在localStorage中统一管理。
	 * @param {string} key - 原始键名。
	 * @returns {string} 返回带有前缀的键名。
	 */
	setKey(key) {
		// 重置键名
        return `${generateUUID()}-${key}`;
	},
	/**
	 * 设置永久缓存项。可选设置缓存时间，默认为不设置过期时间。
	 * @param {string} key - 缓存键名。
	 * @param {*} val - 缓存的值。
	 * @param {number} [cacheTime=0] - 缓存时间（单位：秒），0表示不设置过期时间。
	 */
	set(key, val, cacheTime = 0) {
		if (cacheTime != 0) {
			val.DEFAULT_CACHE_TIME = DEFAULT_CACHE_TIME * cacheTime + Date.now();
		}
		window.localStorage.setItem(Local.setKey(key), JSON.stringify(val));
	},
	/**
	 * 获取永久缓存项。如果缓存过期，则清除该缓存并返回null。
	 * @param {string} key - 缓存键名。
	 * @returns {*} 缓存的值，或在过期后返回null。
	 */
	get(key) {
		let json = window.localStorage.getItem(Local.setKey(key));
		const result = JSON.parse(json);
		if (result?.DEFAULT_CACHE_TIME && Date.now() > result?.DEFAULT_CACHE_TIME) {
			// 过期 清除数据
			Local.remove(key);
			return null;
		} else {
			// 没过期
			return JSON.parse(json);
		}
	},
	/**
	 * 根据键名移除永久缓存项。
	 * @param {string} key - 缓存键名。
	 */
	remove(key) {
		window.localStorage.removeItem(Local.setKey(key));
	},

	/**
	 * 清除所有永久缓存项。
	 */
	clear() {
		window.localStorage.clear();
	},
};

/**
 * window.sessionStorage 浏览器临时缓存
 * @method set 设置临时缓存
 * @method get 获取临时缓存
 * @method remove 移除临时缓存
 * @method clear 移除全部临时缓存
 */
export const Session = {
	// 设置临时缓存
	set(key, val) {
		window.sessionStorage.setItem(Local.setKey(key), JSON.stringify(val));
	},
	// 获取临时缓存
	get(key) {
		let json = window.sessionStorage.getItem(Local.setKey(key));
		return JSON.parse(json);
	},
	// 移除临时缓存
	remove(key) {
		window.sessionStorage.removeItem(Local.setKey(key));
	},
	// 移除全部临时缓存
	clear() {
		window.sessionStorage.clear();
	},
};
/**
 * window.sessionStorage 浏览器临时缓存
 * @method set 设置临时缓存
 * @method get 获取临时缓存
 * @method remove 移除临时缓存
 * @method clear 移除全部临时缓存
 */
export const Cookie = {
	// 设置临时缓存
	set(key, val, { expires = 7 }) {
		return Cookies.set(key, val, { expires });
	},
	// 获取临时缓存
	get(key) {
		return Cookies.get(key);
	},
	// 移除临时缓存
	remove(key) {
		return Cookies.remove(key);
	},
	// 移除全部临时缓存
	clear() {
		// 获取所有的Cookie名称
		const cookieNames = Object.keys(Cookies.get());
		// 遍历所有的Cookie名称并将其移除
		cookieNames.forEach(name => {
			Cookies.remove(name);
		});
	},
};

